package db_interaction;

import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import org.hibernate.Query;
import org.hibernate.Session;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author Nuno
 */
@Entity
@Table(name = "utilizador")
public class Utilizador implements Serializable {

    @Id
    @GeneratedValue
    private int Utilizador_id;
    @Basic
    @Column(name = "Utilizador_nome")
    private String Utilizador_nome;
    @Basic
    @Column(name = "Utilizador_data_nascimento")
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date Utilizador_data_nascimento;
    @Basic
    @Column(name = "Utilizador_sexo")
    private String Utilizador_sexo;
    @Basic
    @Column(name = "Utilizador_estado_civil")
    private String Utilizador_estado_civil;
    @Basic
    @Column(name = "Utilizador_email")
    private String Utilizador_email;
    @Basic
    @Column(name = "Utilizador_telemovel")
    private String Utilizador_telemovel;
    @Basic
    @Column(name = "Utilizador_pais")
    private String Utilizador_pais;
    @Basic
    @Column(name = "Utilizador_password")
    private String Utilizador_password;
    @Basic
    @Column(name = "Utilizador_distrito")
    private String Utilizador_distrito;
    @Basic
    @Column(name = "Utilizador_concelho")
    private String Utilizador_concelho;
    @Basic
    @Column(name = "Utilizador_freguesia")
    private String Utilizador_freguesia;
    @Basic
    @Column(name = "Utilizador_activo")
    private Boolean Utilizador_activo;
    @OneToMany(mappedBy = "utilizador", cascade = CascadeType.ALL)
    private Set<Publicacao> publicacao = new HashSet<Publicacao>();

    //@OneToMany(mappedBy = "utilizador", cascade = CascadeType.ALL)
    //private Set<Amigos> amigos = new HashSet<Amigos>();
    public Set<Publicacao> GetPublications() {
        return this.publicacao;
    }

    public void SetPublications(Set<Publicacao> pub) {
        this.publicacao = pub;
    }

    public Utilizador() {
    }

    public int getid() {
        return Utilizador_id;
    }

    public String getNome() {
        return Utilizador_nome;
    }

    public Date getDataNascimento() {
        return Utilizador_data_nascimento;
    }

    public String getSexo() {
        return Utilizador_sexo;
    }

    public String getEstado_Civil() {
        return Utilizador_estado_civil;
    }

    public String getEmail() {
        return Utilizador_email;
    }

    public String getTelemovel() {
        return Utilizador_telemovel;
    }

    public String getPais() {
        return Utilizador_pais;
    }

    public String getPassword() {
        return Utilizador_password;
    }

    public String getDistrito() {
        return Utilizador_distrito;
    }

    public String getConcelho() {
        return Utilizador_concelho;
    }

    public String getFreguesia() {
        return Utilizador_freguesia;
    }

    public Boolean getActivo() {
        return Utilizador_activo;
    }

    public void setId(int id) {
        this.Utilizador_id = id;
    }

    public void setNome(String x) {
        this.Utilizador_nome = x;
    }

    public void setDataNascimento(String x) throws ParseException {

        DateFormat df = new SimpleDateFormat("MM/dd/yyyy");

        Date date = df.parse(x);

        this.Utilizador_data_nascimento = date;
    }

    public void setSexo(String x) {
        this.Utilizador_sexo = x;
    }

    public void setEstadoCivil(String x) {
        this.Utilizador_estado_civil = x;
    }

    public void setEmail(String x) {
        this.Utilizador_email = x;
    }

    public void setTelemovel(String x) {
        this.Utilizador_telemovel = x;
    }

    public void setPais(String x) {
        this.Utilizador_pais = x;
    }

    public void setPassword(String x) throws UnsupportedEncodingException, NoSuchAlgorithmException {
        byte[] bytesOfMessage = x.getBytes("UTF-8");

        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] thedigest = md.digest(bytesOfMessage);

        String aux = new String(thedigest);
        this.Utilizador_password = aux;
    }

    public void setDistrito(String x) {
        this.Utilizador_distrito = x;
    }

    public void setConcelho(String x) {
        this.Utilizador_concelho = x;
    }

    public void setFreguesia(String x) {
        this.Utilizador_distrito = x;
    }

    public void setActivo(Boolean x) {
        this.Utilizador_activo = x;
    }

    //DB access
    public int insertEntityValidation(Utilizador user) {
        List<Utilizador> users = null;
        Session s = NewHibernateUtil.getSessionFactory();


        //returns 1 if found and 0 if not found

        try {
            s.beginTransaction();

            Query q = s.createQuery("from Utilizador where Utilizador_email = " + user.getEmail());
            users = q.list();

            s.getTransaction().commit();

            for (int i = 0; i < users.size(); i++) {
                if (user.getPassword().equals(users.get(i).getPassword())) {
                    return 0;
                }
            }
            return -1;
        } catch (Exception e) {
            return 1;
        }



    }

    public int insertEntity(Utilizador user) {
        //returns 1 if successfull
        //return -1 if error

        try {
            Session s = NewHibernateUtil.getSessionFactory();
            s.beginTransaction();
            s.save(user);
            s.getTransaction().commit();
            return 1;
        } catch (Exception e) {
            return -1;
        }
    }

    public String SelectEntity(Utilizador user) {
        List<Utilizador> users = null;


        try {
            Session s = NewHibernateUtil.getSessionFactory();


            s.beginTransaction();

            Query q = s.createQuery("from Utilizador where Utilizador_email like'%" + user.getEmail() + "%'");
            users = q.list();

            s.getTransaction().commit();


            return users.get(0).getNome();


        } catch (Exception e) {
            return null;
        }
    }

    public String SelectEntityV2(String email) {
        List<Utilizador> users = null;


        try {
            Session s = NewHibernateUtil.getSessionFactory();


            s.beginTransaction();

            Query q = s.createQuery("from Utilizador where Utilizador_email like'%" + email + "%'");
            users = q.list();

            s.getTransaction().commit();


            return users.get(0).getNome();


        } catch (Exception e) {
            return null;
        }
    }

    public Utilizador SelectUser(String email) {
        List<Utilizador> users = null;


        try {
            Session s = NewHibernateUtil.getSessionFactory();


            s.beginTransaction();

            Query q = s.createQuery("from Utilizador where Utilizador_email like'%" + email + "%'");
            users = q.list();

            s.getTransaction().commit();

            return users.get(0);

        } catch (Exception e) {
            return null;
        }
    }

    public Utilizador SelectUserV2(String email, String password) {
        List<Utilizador> users = null;


        try {
            Session s = NewHibernateUtil.getSessionFactory();


            s.beginTransaction();

            Query q = s.createQuery("from Utilizador where Utilizador_email like'%" + email + "%'");
            users = q.list();

            s.getTransaction().commit();


            byte[] bytesOfMessage = password.getBytes("UTF-8");

            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] thedigest = md.digest(bytesOfMessage);

            String password_md5 = new String(thedigest);

            if (users.get(0).getPassword().equals(password_md5)) {
                return users.get(0);
            } else {
                return null;
            }

        } catch (Exception e) {
            return null;
        }
    }

    public List<Utilizador> SelectUserAJAX(String email) {
        List<Utilizador> users = null;


        try {
            Session s = NewHibernateUtil.getSessionFactory();


            s.beginTransaction();

            Query q = s.createQuery("from Utilizador where Utilizador_email like '" + email + "%'");
            users = q.list();

            s.getTransaction().commit();


            return users;


        } catch (Exception e) {
            return null;
        }
    }

    public List<Utilizador> SelectByValue(String email) {
        List<Utilizador> users = null;


        try {
            Session s = NewHibernateUtil.getSessionFactory();


            s.beginTransaction();

            Query q = s.createQuery("from Utilizador where Utilizador_email like '" + email + "%'");
            users = q.list();

            s.getTransaction().commit();


            return users;


        } catch (Exception e) {
            return null;
        }
    }

    public Utilizador SelectUserID(int id_user) {
        List<Utilizador> users = null;


        try {
            Session s = NewHibernateUtil.getSessionFactory();


            s.beginTransaction();

            Query q = s.createQuery("from Utilizador where Utilizador_id = " + id_user);
            users = q.list();

            s.getTransaction().commit();


            return users.get(0);


        } catch (Exception e) {
            return null;
        }
    }

    public String SelectPublicationsUser(Utilizador user) {
        List<Utilizador> users = null;

        //returns sellected friend if successfull
        //return null
        try {
            Session s = NewHibernateUtil.getSessionFactory();
            //userr = (Utilizador) s.load(Utilizador.class, user.getid());
            //s.getTransaction().commit();
            //return userr;

            s.beginTransaction();

            Query q = s.createQuery("from Utilizador where Utilizador_email like'%" + user.getEmail() + "%'");
            users = q.list();

            s.getTransaction().commit();

            for (int i = 0; i < users.size(); i++) {
                return users.get(i).getNome();
            }


        } catch (Exception e) {
            return null;
        }
        return null;
    }

    public List<Utilizador> SelectPublicationsFriendsV2(String email) {

        List<Utilizador> ut = null;
        Utilizador user_pub = null;
        List<Utilizador> user_publications = new ArrayList<Utilizador>();
        List<Amigos> amigo = null;
        List<Publicacao> pubs = null;

        int id_user_login, id_amigo;
        //returns sellected friend if successfull
        //return null
        try {
            Session s = NewHibernateUtil.getSessionFactory();

            // Pesquisa o ID do user logado
            s.beginTransaction();


            Query q = s.createQuery("from Utilizador where Utilizador_email like'%" + email + "%'");
            ut = q.list();

            s.getTransaction().commit();

            id_user_login = ut.get(0).getid();

            // Faz uma query para encontrar os seus amigos

            s.beginTransaction();

            Query q2 = s.createQuery("from Amigos where Amigos_utilizador_id = " + id_user_login + " and Amigos_activo = 1");
            amigo = q2.list();

            s.getTransaction().commit();

            for (int i = 0; i < amigo.size(); i++) {
                id_amigo = amigo.get(i).GETAmigos_Utilizador_id_amigo();

                s.beginTransaction();

                Query q3 = s.createQuery("from Utilizador where Utilizador_id = " + id_amigo);
                user_pub = (Utilizador) q3.list().get(0);

                s.getTransaction().commit();

                user_publications.add(user_pub);
            }

            return user_publications;

        } catch (Exception e) {
            return null;
        }
    }

    public Utilizador SelectPublicationsFriends(String email) {
        List<Utilizador> users = null;
        Utilizador Ut;


        //returns sellected friend if successfull
        //return null
        try {
            Session s = NewHibernateUtil.getSessionFactory();
            Query qq = null;
            Query q = null;


            s.beginTransaction();

            q = s.createQuery("from Utilizador where Utilizador_email like'%" + email + "%'");
            users = q.list();
            s.getTransaction().commit();

            Ut = users.get(0);

            //Ut = (Utilizador) s.load(Utilizador.class, users.get(0));

            return Ut;


        } catch (Exception e) {
            return null;
        }
    }

    public int UpdateEntity(Utilizador user) {
        //returns 1 if successfull
        //return -1 if error
        try {
            Session s = NewHibernateUtil.getSessionFactory();
            s.save(user);
            s.getTransaction().commit();
            return 1;
        } catch (Exception e) {
            return -1;
        }
    }

    public Boolean UpdatePass(Utilizador user, String password) throws UnsupportedEncodingException, NoSuchAlgorithmException {

        int id_user = user.getid();

        byte[] bytesOfMessage = password.getBytes("UTF-8");

        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] thedigest = md.digest(bytesOfMessage);

        String aux_pass = new String(thedigest);

        try {
            Session s = NewHibernateUtil.getSessionFactory();

            // Actualizar tabela de utilizadores com a nova password
            s.beginTransaction();
            Query q6 = s.createQuery("update Utilizador set Utilizador_password = '" + aux_pass + "' where Utilizador_id = " + id_user);
            q6.executeUpdate();
            s.getTransaction().commit();



            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public int ValidateEntity(Utilizador user) {

        List<Utilizador> users = null;

        //returns 1 if found and 0 if not found

        try {
            Session s = NewHibernateUtil.getSessionFactory();
            s.beginTransaction();

            Query q = s.createQuery("from Utilizador where Utilizador_email like'%" + user.getEmail() + "%'");
            users = q.list();

            s.getTransaction().commit();

            for (int i = 0; i < users.size(); i++) {
                if (user.getPassword().equals(users.get(i).getPassword())) {
                    return 1;
                }
            }
            return -1;
        } catch (Exception e) {
            return 0;
        }
    }
}